Checksum des trames de téléinformation enedis

Documentation Enedis

Pasted image 20260723224413.png

Python

def checksum(frame):
    somme = 0
    for c in frame[:-1]:
        somme += ord(c)
    somme_trunc = bin(somme)[-6:]
    calc_check = chr(32 + int(somme_trunc, 2))
    if calc_check == frame[-1:]:
        return True
    else:
        return False

JavaScript

function checksum(frame) {
    let somme = 0;
    for (let i = 0; i < frame.length - 1; i++) {
        somme += frame.charCodeAt(i);
    }
    const sommeTrunc = (somme & 0b111111).toString(2);
    const calcCheck = String.fromCharCode(32 + parseInt(sommeTrunc, 2));
    if (calcCheck === frame.slice(-1)) {
        return true;
    } else {
        return false;
    }
}

C

#include <stdbool.h>
#include <stddef.h>
#include <string.h>

bool checksum(const char *frame) {
    size_t longueur = strlen(frame);
    unsigned int somme = 0;
    if (longueur == 0) {
        return false;
    }

    for (size_t i = 0; i < longueur - 1; i++) {
        somme += (unsigned char)frame[i];
    }

    char calc_check = (char)(32 + (somme & 0b111111));
    return calc_check == frame[longueur - 1];
}

Rust

fn checksum(frame: &str) -> bool {
    let octets = frame.as_bytes();
    let mut somme: u32 = 0;
    if octets.is_empty() {
        return false;
    }

    for octet in &octets[..octets.len() - 1] {
        somme += u32::from(*octet);
    }

    let calc_check = 32 + (somme & 0b111111) as u8;
    calc_check == octets[octets.len() - 1]
}